Django 文件在提到佈署的時候,建議不要使用 Django 來服務靜態的檔案,靜態的檔案讓專業的網頁伺服器 - Nginx / Apache 來處理比較有效率。但也有人認為這其實無傷,而且讓 Django 來處理也有不少好處,其中一個好處就是便於 Docker 容器化,所以就有了 WhiteNoise。
除了便於容器化之外,一些 PaaS,例如 Heroku 的佈署 Django 教學也建議使用 WhiteNoise 。
專案文件網址:http://whitenoise.evans.io/en/stable/
poetry add whitenoise
# settings
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
設定這邊要注意幾件事情:
基本上這樣就完成了。
P.S. 以正式環境執行時,要記得執行 manage.py collectstatic
,將靜態檔案收集到 STATIC_ROOT 所指定的資料夾去,否則會有 Internal server error (我查了好一會才想到是這個原因)。
使用 CDN 的話,要設置 STATIC_URL:
# settings
import environ
# ...
env = environ.Env()
# ...
STATIC_HOST = env('DJANGO_STATIC_HOST', default='')
STATIC_URL = STATIC_HOST + '/static/'
像上面這段,就增加了 STATIC_HOST,從環境變數來讀取。假設環境變數 DJANGO_STATIC_HOST 是 "https://mycdn.cloudfront.net" 。在 template 裡,我們會使用 {% static 'xxx.css' %}
來表明要引用哪個靜態檔案,實際上輸出的結果會是 STATIC_URL 裡的內容再加上你所引用的檔案,所以前面提到的 {% static 'xxx.css' %}
會變成 https://mycdn.cloudfront.net/static/xxx.css
關於 brotli 壓縮法,可以看 gslin 在 2015 年分享的「Google 推出 Brotli 無損壓縮法」,簡單的說,瀏覽器是使用 Gzip 來壓縮 / 解壓縮,Google 推出的 Brotli 壓縮法的壓縮率更好,而且不影響速度。
要使用 brotli 也很簡單,在安裝時,使用下面指令來安裝就可以了。
poetry add "whitenoise[brotli]"
安裝以後,whitenoise 會自動偵測 brotli 套件,並且使用,無需我們費心。
whitenoise 不只可以用在 Django 上,也可以用在 Flask 上,關於 Flask 的部份可以參考這篇:Using WhiteNoise with Flask — WhiteNoise 5.2.0 documentation , whitenoise 就介紹到這裡囉。
範例程式碼網址:https://github.com/elleryq/ithome-iron-2020-django/tree/day-23